package com.szjz.elasticsearch.eshelper.property;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author shibo
 * @desc es属性
 * @date 2020/6/1 周一
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.elasticsearch.rest")
public class ESRestClientProperties {

	/**
	 * Comma-separated list of the Elasticsearch instances to use.
	 */
	private List<String> uris = new ArrayList<>(Collections.singletonList("http://localhost:9200"));

	/**
	 * Credentials username.
	 */
	private String username;

	/**
	 * Credentials password.
	 */
	private String password;

	/**
	 * Connection timeout.
	 */
	private Duration connectionTimeout = Duration.ofSeconds(1);

	/**
	 * Read timeout.
	 */
	private Duration readTimeout = Duration.ofSeconds(30);

	/**
	 * scheme : http or https
	 */
	private String scheme;

	/**
	 * 是否开启debug日志
	 * 默认关闭
	 */
	private Boolean debug = false;

	/**
	 * 对于按天分库的数据 可指定可查询的历史天数
	 */
	private Integer searchBeforeDay = null;

	/**
	 * 需要定时创建索引库的实体类路径
	 */
	private List<String> esCreateIndexEntityPaths = new ArrayList<>();

	/**
	 * 定时创建索引库 cron表达式
	 */
	private String esCreateIndexCron = null;

	/**
	 * 需要定时删除索引库的实体类路径 只适用按照时间分库的es实体类
	 */
	private List<String> esDeleteIndexEntityPaths = new ArrayList<>();

	/**
	 * 定时删除索引库 cron表达式
	 */
	private String esDeleteIndexCron = null;

	/**
	 * 数据主分片数，默认为5，有时候设置为3
	 * 单个shard最大的文档数2,147,483,519
	 * 创建索引时指定，后期无法修改
	 */
	Integer shardNum = 5;

	/**
	 * 数据备份数，就是主分片的复制数，备份数。如果只有一台机器，设置为0
	 * 后期可以动态修改
	 */
	Integer replicaNum = 1;

	/**
	 * es默认size最大值10000
	 * 当数据量过大的时候可能无法满足需求
	 */
	Integer size = 100000;

	/**
	 * es数据刷新频率
	 * 默认：1s刷新一次
	 * 刷新间隔为-1代表关闭数据刷新
	 * 刷新间隔设置时应改携带单位，如：1h、2m、3s
	 * 为了增加数据插入es的速度，就要增大es刷新数据的的时间间隔 设置为10s
	 */
	String refreshInterval = "10s";


	@NestedConfigurationProperty
	private Month month = new Month();

	@Data
	public static class Month {
		/**
		 * 按月分库--需要定时创建索引库的实体类路径
		 * 每月个的25到31号每天创建一次索引库
		 */
		private List<String> createIndexEntityPaths = new ArrayList<>();

	}

}

